--- title: "1、第几天" created: 2025-11-28 tags: - 算法 --- # 1、第几天 ## 题目 [第几天](https://www.lanqiao.cn/paper/3848/problem/614/) ![[image-266f5bc8.png]] ## 思路分析 日期问题 组合拳 用nextday直到某天的判断技巧 `cury == 2000`:这个条件确保循环只在2000年内进行。一旦年份超过2000年,循环就会停止。 `(curm < 5 || (curm == 5 && curd < 4))`:这个条件分为两部分,用逻辑或`||`连接: `curm < 5`:如果当前月份小于5(即1月到4月),条件为真,循环继续。 `(curm == 5 && curd < 4)`:如果当前是5月,并且日期小于4日,则条件也为真,循环同样继续。 这个复合条件的意思是,只要没有达到2000年5月4日这一天,循环就会继续执行。当到达5月4日时,`curm == 5 && curd < 4`这一条件变为假,因为`curd < 4`不再成立,这时外层的`curm < 5`条件也不成立,因为已经是5月了,所以整个循环条件变为假,循环停止。 通用写法 ```cpp while ((curYear < 给定年份) || (curYear == 给定年份 && curMonth < 给定月份) || (curYear == 给定年份 && curMonth == 给定月份 && curDay < 给定日子)) { // 执行 nextday 操作 } ``` ## 代码实现 ```cpp #include using namespace std; int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool is_leap(int y){ return y%100 && y%4==0 || y%400==0; } int getdays(int y,int m){ return days[m]+(m==2 && is_leap(y)); } void nextday(int &y,int &m,int &d){ d++; if(d>getdays(y,m)){ d=1; m++; if(m>12){ m=1; y++; } } } int main() { int cury=2000,curm=1,curd=1; int cnt=1; while(cury == 2000 && (curm < 5 || (curm == 5 && curd < 4))){ nextday(cury,curm,curd); cnt++; } cout<